﻿<html>
	<head>
		<title>Manual de utilização do Monkey Moore v0.4 - BETA</title>
		<link rel="stylesheet" type="text/css" href="main.css" />
	</head>
	<body>
	<div id="container">
	<center><h1>Manual de utilização do Monkey Moore v0.4 - BETA</h1></center>
	<h3>Introdução</h3>
	<p>Antes de entender como as buscas funcionam no novo <span class="hl">Monkey-Moore</span> (<span class="bl">MM</span>), é preciso entender como isso era feito originalmente.</p>
	<p>É comum muita gente usar buscas relativas para hackear jogos sem realmente compreender o processo que está por trás disso. O resultado é que acabamos não utilizando todo o potencial desta ferramenta valiosa que temos em mãos, e muitos problemas de fácil solução viram verdadeiros martírios, e muitas vezes, causa de abandono de vários projetos.</p>
	<p>É de conhecimento geral que existem vários padrões (encodes) criados para representar textos em computadores. Já usamos muitos deles sem saber, como é o caso do <span class="hl">ASCII</span>, que é uma tabela que mapeia os valores que o computador trabalha e os caracteres usados pelos seres humanos, ou seja, determina que um valor específico representa um caractere específico. Abaixo segue essa tabela em uma imagem que achei no google:</p>
	
	<center><img src="img/ASCII1.GIF"/></center>
	
	<p>Percebam, que nesse padrão, o valor <span class="bl">0x41</span> representa o caractere "A" e <span class="bl">0x42</span> o "B". Se um jogo utilizar esse padrão e você fizer uma busca <span class="hl">textual</span>, os resultados que você obtiver terão sempre esses valores indicados na tabela. Mas esse não é o problema. O problema é quando os programadores resolvem, por diversos motivos, não utilizar esse padrão... É aí que a busca relativa entra em jogo.</p>
	<h3>Mas o que é uma busca relativa?</h3>
	<p>É simples, realmente não existe muito segredo, como já foi dito anteriormente: assumindo que estamos lidando com o nosso alfabeto, na sequencia normal: '<span class="hl">abcdefghijklmnopqrstuvwxyz</span>', é bastante óbvio que, considerando as posições das letras, se o '<span class="bl">a</span>', por exemplo, tem valor <span class="bl">0x61</span>, a letra '<span class="bl">b</span>' vai ter o valor <span class="bl">0x62</span>, a '<span class="bl">c</span>' terá <span class="bl">0x63</span> e assim vai, até a '<span class="bl">z</span>', que teria valor <span class="bl">0x7A</span>, porque elas são seqüênciais.</p>
	<p>Os valores utilizados no exemplo refletem a <span class="bl">tabela ASCII</span>. Se os criadores de jogos não seguirem esse padrão (algo comum em jogos orientais, que não utilizam o nosso alfabeto, e em consoles mais antigos, como o NES/SNES), vamos precisar descobrir a seqüência de bytes que representa o nosso alfabeto... Criei, usando o programa <span class="hl">Table Manager</span>, várias possibilidades. Vejam:</p>
	
	<center><img src="img/tm1.PNG" /></center>
	<p>Na imagem acima, '<span class="bl">A</span>' tem valor <span class="bl">0x00</span>, e '<span class="bl">a</span>' <span class="bl">0x80</span>. Todas as outras letras têm valores seqüênciais a um desses dois valores...</p>
	<center><img src="img/tm2.PNG" /></center>
	<p>Mesma coisa, mas agora '<span class="bl">A</span>' é <span class="bl">0x20</span> e '<span class="bl">a</span>', <span class="bl">0x40</span>.</p>
	<center><img src="img/tm3.PNG" /></center>
	<p>Neste último exemplo, '<span class="bl">A</span>' têm valor <span class="bl">0xE0</span> e '<span class="bl">a</span>', <span class="bl">0xC0</span>. Notem que existem muitas possibilidades... Como descobrir qual a usada pelo criador do jogo?</p>
	
	<p>Reparem que, independentemente do código usado, a seqüência do alfabeto é sempre a mesma. Reparem nos valores seqüênciais e que a posição de '<span class="bl">a</span>' vai ser sempre antes de '<span class="bl">b</span>', e que entre '<span class="bl">a</span>' e '<span class="bl">c</span>', por exemplo, existe sempre o '<span class="bl">b</span>'. Essa é a <span class="bl">chave</span> para entender a busca relativa: <span class="hl">a posição</span>. Repare:</p>

	<center><img src="img/pos1.png" /></center>
	
	<p>Vamos considerar apenas as <span class="hl">posições</span> dos caracteres: '<span class="bl">a</span>' está na posição <span class="bl">1</span>, '<span class="bl">b</span>' está na posição <span class="bl">2</span>, e assim por diante. A busca relativa trabalha em cima disso, ou seja, das diferenças de posição e não de valores, como somos levados a crer em um primeiro momento. A diferença entre a posição de '<span class="bl">b</span>' e '<span class="bl">a</span>' vai ser <span class="bl">2 - 1 = +1</span>. Se você fizer uma busca relativa por '<span class="bl">ab</span>', qualquer programa vai te retornar todas as ocorrências que tenham <span class="bl">DOIS</span> bytes ('a' e 'b'), e que o segundo byte seja <span class="bl">SEMPRE</span> o valor do primeiro byte <span class="bl">+1</span>! Analogamente, se procurarmos por "<span class="bl">ba</span>", estamos dizendo ao programa que queremos todos os conjuntos de dois bytes ('b' e 'a') cuja diferença entre os dois bytes (byte de 'a' - byte de 'b') seja <span class="bl">-1</span>, ou seja, que o segundo byte esteja sempre um valor abaixo do valor do primeiro byte.</p>
	<p>Durante a busca, todos os padrões encontrados que sigam essa pequena regra das diferenças vai ser considerado um resultado. Assim, quando procurando por "<span class="bl">ba</span>", se o programa usado encontrar os bytes <span class="bl">0x89</span> e <span class="bl">0x88</span>, esse resultado será exibido; se, procurando por "<span class="bl">ab</span>" ele encontrar os bytes <span class="bl">0x3A</span> e <span class="bl">0x3B</span>, ele vai considerar válido e retornar como um possível resultado.</p>
<p>Não preciso dizer que não é muito bom você fazer uma busca relativa com apenas dois caracteres... Existem muitos conjuntos de bytes dentro de uma ROM que se enquadram em padrões mais simples. Esse é um dos motivos de não aconselharmos, e de fato, no <span class="bl">MM</span> ser proibido, fazer uma busca relativa por palavras com menos de <span class="hl">3</span> caracteres. Se quer resultados mais apurados, faça buscas com no mínimo <span class="hl">4</span> caracteres.</p>
<p>Tem mais coisa, mas isso que você acabou de ler é exatamente como funcionava a busca relativa até hoje. O MM veio mudar isso, mas antes vamos ver como ele faz o básico.

	<h3>Como isso funciona no MM?</h3>
	<p>Vamos ver a interface básica do MM:</p>
	<center><img src="img/mm1.png" /></center>
	<p>Ignorem, por enquanto, os itens que não possuem números, falaremos deles mais tarde. Podemos ver:</p>
	<ol>
		<li>Caminho do arquivo a ser analisado, basta clicar no botão do lado direito para escolher o arquivo;</li>
		<li>O tipo de pesquisa a ser feita. As opções são "Busca Relativa" e "Busca por Valores Relativos", no momento só cobriremos a primeira opção;</li>
		<li>Palavra a ser procurada. De início, você só pode digitar letras do nosso abcdário, não usando pontuação ou acentos;</li>
		<li>Ativa o uso de caracteres coringas. Coringas são caracteres especiais que assumem a posição de qualquer caractere. Falaremos sobre isso mais adiante, mas é regra do MM que se você utilizar coringas no campo de busca, eles não contam para o número de caracteres deste, ou seja, você precisa ter sempre 3 ou mais caracteres que não sejam coringas para prosseguir;</li>
		<li>Botão que dá inicio à pesquisa;</li>
		<li>Parece óbvio, mas não custa nada comentar. Caso você obtenha vários resultados que indiquem seqüências idênticas, somente o primeiro resultado será exibido, a não ser que você ative esta opção;</li>
		<li>Espaço em que os resultados serão exibidos. Possui três campos: "Offset" mostra a posição da ocorrência, "Values" exibe os valores para os primeiros caracteres usados na seqüência (no momento o MM exibirá os valores de 'A' e 'a' de acordo com os resultados obtidos), e finalmente, o campo "Preview" vai mostrar uma prévia do que tem naquele endereço. Isso vai te poupar MUITO tempo, confie em mim ;)</li>
		<li>Uma vez feita uma busca que deu resultados, você pode pedir para o MM criar uma tabela para você. Simples, rápido e principalmente: fácil;</li>
		<li>Limpa todos os resultados;</li>
		<li>Exibe informações sobre o programa;</li>
		<li>Mostra a quantidade de resultados obtidos.</li>
	</ol>
	<p>Continuando com o que falávamos, para fazer uma busca relativa básica no MM, precisamos apenas escolher o arquivo (1), ter certeza de que estamos fazendo uma busca relativa (2), digitarmos o que queremos procurar, considerando se queremos ou não usar coringas (3 e 4), e finalmente clicar no botão "Pesquisar" (5).</p>
	<center><img src="img/mm2.png" /></center>
	<p>Aqui eu fiz uma busca no jogo "Ys 3" de Super Nintendo, um projeto meu. Procurei por "Welcome" e obtive três resultados. Destaquei o primeiro por ser possível ler o texto escrito no preview, isso nos diz que obtivemos um resultado aceitável. Seleciono o primeiro resultado e mando o MM criar uma tabela baseada nele. A tabela é sempre salva em <a href="http://pt.wikipedia.org/wiki/UTF-8">UTF-8</a>, então tenha certeza de que o editor hexadecimal usado suporte esse encode, caso contrário, é de sua responsabilidade realizar a conversão. Simples né? Aposto que até agora só falamos de coisas que vocês já sabiam. Então vamos logo para as novidades da versão 0.4!</p>
	<h3>Busca por valores relativos</h3>
	<p>Esse nome que parece complicado é um recurso simples e muito útil que existe, ao menos que sabemos, no Translhextion. Com ele podemos, ao invés de usar um alfabeto ou coisa parecida, utilizar a diferença entre valores como base para a busca.</p>
	<p>Agora É A HORA que você pergunta: para quê diabos vou usar isso? Na verdade, só quem vai usar esse recurso é quem REALMENTE sabe o que está fazendo e o que está procurando. Portanto, isso vai depender muito da sua criatividade. Darei um exemplo simples, não vou me prolongar nesse assunto: imagine que você tem uma seqüência de tiles, que você conhece e viu no editor de tiles, que formam uma placa que está no seu jogo, e você precisa descobrir como editá-la de modo que você possa mexer nas suas dimensões. Você vai provavelmente precisar no tilemap referente àquele gráfico, mas como descobrir aonde mexer, sem conhecer assembly ou esses outros recursos mais 'avançados' que estão disponíveis por aí na base de muita gambiarra e trabalho manual? Utilizando as posições relativas dos tiles, como você os vê no editor, é possível fazer uma busca na ROM para tentar achar o tilemap, e se a ROM não usar nenhum sistema estranho para armazená-lo ou se não usar compressão, são grandes as chances de você encontrá-lo na ROM. E é 100% certo que você vai encontrar o que precisa em um dump da RAM.</p>
	<p>Sei que esse foi um exemplo pra lá de estranho, mas foi o único que consegui imaginar, já que o outro uso muito comum da busca por valores é para procurar textos em japonês, algo que o MM faz de um modo muito mais estiloso. Por isso não entrarei nesse assunto agora, quando chegarmos lá, voltarei à busca por valores. Por hora, vamos ver como fazer uma busca por valores no MM.</p>
	
	<center><img src="img/mm3.png" /></center>
	
	<p>Como dá pra ver, basta ativar a opção correta em (2), digitar os valores a serem usados como base (decimal e sempre separados por espaço), e mandar bala. Veja que ao invés de letras, o programa exibirá os valores dos bytes na posição encontrada. O MM vai calcular as diferenças entre os valores que você digitou e fará uma busca aplicando esse padrão. Não entendeu? Se eu digitar "10 15 20", o MM buscará por um conjunto de três bytes no qual o terceiro e último byte será 5 'números' maior que o segundo, e este, por sua vez, será 5 'números' maior que o primeiro. No exemplo da imagem, mandei fazer uma busca por "32 34 38 30". Isso significa que procuro por um conjunto de bytes que se encaixem no padrão: b, +2, +4, -8, que é o mesmo que dizer "o último byte tem que ser menor que o terceiro em 8 'números', o terceiro, por sua vez, tem que ser 4 números maior que o segundo, e este tem que ser dois números maior que o primeiro".</p>
	<p>Eu sei que parece complicado, mas quando você entende que está buscando por bytes que batam com as diferenças que você digitou, isso fica fácil, e um leque de opções se abre para você. Só vai depender de como você vai usar este recurso.</p>
	<h3>Definindo novos padrões</h3>
	<p>Está tudo bem, tudo muito bom... Mas, e se o maldito programador resolveu, digamos, usar uma tabela desordenada (com certeza você já ouviu esse termo, certo?). Se, ao invés do basicão "abcdefghijklmnopqrstuvwxyz", o infeliz resolveu escolher "aeioubcdfghjklmnpqrstvwxyz"? É aqui que o MM começa a se destacar. Se você leu a seção sobre busca relativa, vai saber que todas as buscas feitas por qualquer programa até hoje usa o padrão ASCII como base para o trabalho, ou seja, eles consideram a seqüência normal do nosso alfabeto como verdadeira sempre e aplicam isso usando implícitamente esse padrão. Se você fizer uma busca simples, mesmo no MM, sem setar as devidas configurações, por "ab", o programa procurará com base nas posições 'originais' dos caracteres, ou seja, vai buscar por b, b+1 (não confundir esse b com o 'b', este é a letra, aquele é o que estou usando para indicar qualquer byte), quando na verdade, usando o padrão definido no jogo, deveria procurar por b, b+5! Como resolver isso?</p>
	<p>Poderíamos tomar o caminho árduo, através da busca por valores... Você pode colocar esse alfabeto em ordem alternativa em uma folha de papel e dar a cada letra o número da sua posição, algo como na imagem a seguir:</p>
	<center><img src="img/pos2.png" /></center>
	<p>Então, ao procurar por "ab" você procuraria por "1 6", e o programa procuraria por esse padrão... Não preciso dizer que isso, embora muito útil, é masoquismo, né?</p>
	<p>Só uma pequena nota: geralmente dá para descobrir essas tabelas alternativas olhando a seqüência dos tiles no editor...</p>
	<p>Aqui o MM insere um conceito inovador: ele permite que você digite a seqüência que ele deve usar como base nas suas buscas! Eu lembro que já vi ROMs com alfabeto fora de ordem, mas não guardei o nome de nenhuma... Se você conhecer alguma, me manda um email dizendo, assim poderei deixar esse manual mais completo. Posso, no entanto, dar um exemplo usando os dados que forneci acima... Digamos que você já fez tudo quanto é pesquisa na ROM e simplesmente não achou seu texto. Você sabe aonde estão os tiles na ROM, consegue vê-los e sabe que eles seguem essa seqüência: "aeioubcdfghjklmnpqrstvwxyz". Por que não tentar uma busca usando-a como base? Vamos ao MM:</p>
	<center><img src="img/mm4.png" /></center>
	<p>Clicando no botão com a setinha verde para baixo/vermelha para cima (1) você poderá ver/esconder a seção do MM para padrões alternativos. Para ativá-la, basta marcar a caixa de seleção (2) e digitar seu novo padrão no campo de texto que será ativado (3). Quando você tiver editado o padrão e mandar fazer uma nova busca (só é possível buscar com caracteres que estejam no padrão que você definiu, claro), o MM já usará esses dados que você inseriu como base e retornará os resultados também baseados no seu padrão, inclusive na prévia do texto, na caixa de resultados.</p>
	<p>Ao clicar no botão da direita (4) é possível colocar na caixa de texto padrões previamente salvos por você no arquivo "charset.xml" que acompanha o MM em sua pasta principal. Vamos ver como adicionar um novo padrão? É fácil, basta adicionar o seguinte código:</p>
	<center><code>&lt;charset name="Meu Padrão"&gt;aeioubcdfghjklmnpqrstvwxyz&lt;/charset&gt;</code></center>
	<p>Veja o resultado:</p>
	<center><img src="img/mm5.png" /></center>
	<p>Ao clicar no botão (4), aparecerá agora uma nova opção no menu, a que acabamos de adicionar ao arquivo XML, o "Meu Padrão" (que está destacada na imagem). Se você clicar nela, a caixa de texto será automaticamente preenchida com o padrão que você escolheu. Repararam nas outras duas opções? Pois é, vamos falar delas, já, já!</p>
	<h3>MM e japonês</h3>
	<p>Finalmente chegamos à parte que merece maior destaque do MM, e veja que para isso já tivemos que explicar muita coisa... Tecnicamente, o MM trabalha com unicode, então você pode digitar uma palavra usando qualquer caractere que esse charset permita (e sua fonte também :P). Então se você quiser digitar usando letras do antigo Reinado do Macaco Mijão de 666 AC, e unicode permitir isso, o MM dará conta. Claro, a maior utilidade disso tudo vai ser para pesquisas em idiomas asiáticos, mas o que eu vou explicar aqui pode ser aplicado para qualquer idioma. Darei um foco especial ao japonês, e só espero que você leia se você tem alguma noção desse idioma...</p>
	<p>Até agora não existia um método decente para buscar por textos japoneses em ROMs. Se você conseguir digitar algo no seu editor hexadecimal, ele fará uma busca relativa com base em ASCII e não vai achar nada. Se achar, será algo incorreto... Existem gambiarras para resolver isso, muito trabalhosas diga-se de passagem. Lembram do método que expliquei anteriormente de buscar uma palavra por valores relativos (uma opção que existe no Translhextion) usando um padrão diferente do nosso? Pois bem, aplica-se da mesma forma aqui, só que ao invés de usar "aeioubc...z", usa-se a sequencia hiragana/katakana padrão. Como exemplo, digamos que a sequencia é:</p>
	<center><code>あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをゃっゅょ</code></center>
	<p>Você quer procurar por 'あい', então você digita os valores com uma diferença de +1 para a pesquisa (algo como procurar por '1 2' no MM).</p>
	<p>Usando um algoritmo diferente e combinando isso com o poder do unicode, oferecemos a opção de inserir um novo padrão com quaisquer letras que você desejar. Já vi vários jogos onde o padrão está explícito na seqüência de tiles, embora uma boa parte usava a seqüência padrão exibida anteriormente. As outras duas opções que você viu na imagem da seção anterior, de quando clicamos no botão quando criamos um novo padrão insere exatamente os dois mais usados em ROMs para hiragana e katakana.</p>
	<p>Uma vez que o padrão tenha sido escolhido, basta fazer uma pesquisa e vualá, a mágica está feita. Que tal um exemplo, para deixar isso bem claro? O jogo escolhido é de NES, "Satsujin Club". Vejam uma imagem dele:</p>
	<center><img src="img/jogo1.png" /></center>
	<p>Usando o padrão "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわを", fiz uma busca por "あなたなら" (texto que aparece na imagem!), e olhem o que o MM encontrou:</p>
	<center><img src="img/mm6.png" /></center>
	<p>Ele ainda me diz que a primeira letra da minha seqüência possui o valor 0x80 na ROM, a segunda letra tem valor 0x81, a terceira 0x82 e assim sucessivamente... Assim como os offsets, neste caso, o MM também me disse onde eu tenho que editar para alterar o texto que procurei na ROM! Agora já temos uma BOA base para montar a tabela, restando somente terminar de definir os valores comparando o que você encontra na ROM com o que é exibido no emulador... Só por curiosidade, se olharmos a PPU do jogo podemos ver (no caso do NES) a seqüência real dos caracteres: </p>
	<center><img src="img/emu1.png" /></center>
	<p>É claro que isso de ver a PPU só funciona para jogos de NES (duvido que todos), e essa é uma das técnicas usadas para descobrir a tabela de jogos japoneses, mas só funciona para este console. MM no RESTO!</p>
	
	<h3>Buscas por valores de 16bits</h3>
	<p>Esse tipo de busca funciona como em qualquer outro programa. Você digita uma palavra, e se você não souber de alguns caracteres, ou não se importar com quais sejam, você pode usar caracteres especiais chamados de 'coringa'. No MM, você já sabe como definí-los:</p>
	<center><img src="img/mm7.png" /></center>
	<p>Com isso eu disse para o programa: "Procure por determinada palavra, eu não me importo com o que tenha entre o 'e' e o 't', contanto que exista algo lá". Simples né? Se você conhece o conceito de valores de 16bits (não vou explicar isso aqui, esse manual já está ficando muito longo), vai sacar que você tem que fazer uma busca, por exemplo, por "W*e*l*c*o*m*e", e o mesmo para japonês. Se você acha que sua ROM utiliza uma tabela de 16bits, você pode procurar usando os coringas entre as letras japonesas: "あ*な*た*な*ら"!</p>
	
	<h3>Finalizando</h3>
	<p>Acho que por enquanto é só isso pessoal. Peço perdão pelos possíveis erros que passaram, e se falei alguma besteira, se este for o caso, ficarei feliz em receber uma MP sua explicando o que falei de errado. Com este manual, espero que você tenha não só aprendido a mexer no MM, mas também entendido a mecânica por trás de uma busca relativa, coisa que não é muita gente que domina.</p>
	<p>Peço encarecidamente que não me mandem MPs com dúvidas sobre o programa, qualquer coisa desse tipo deve ser postado no tópico do MM no FUT! (http://romhacking.trd.br).</p>
	<p>Até a próxima versão do manual!</p>
	
	<h3>Info</h3>
	<p>Versão do manual: 0.1/2009</p>
	<p>Monkey-Moore foi criado por Darkl0rd</p>
	<p>Este manual foi elaborado por Fallen_Soul e revisado por Darkl0rd</p>
	<p>Grupo: Trans-Center</p>
	<p>Contato: <a href="http://romhacking.trd.br">Fórum Unificado de Traduções</a></p>
	</div>
	</body>
</html>